0 Replies Latest reply on Jan 21, 2011 12:39 PM by Chris Ball

    Inverse OneToOne and JoinTable problem

    Chris Ball Newbie

      I have come across a problem in JBoss 4.2.2 (hibernate 3.2.4) where I cannot insert into or select from an entity (CompanyCar) that is the inverse-side of a @OneToOne join to a second entity (Employee), when the second entity has a @ManyToOne join that uses a @JoinTable.


      This is also a problem in JBoss 5.1, but it appears to have been “fixed” in JBoss 6.0 (hibernate 3.6). Unfortunately we are not yet in a position to consider upgrading the version of JBoss we use.


      I am looking for a workaround that we can use for JBoss 4.2.2. Also I’d like to know if this looks like a genuine bug, or whether I have got something wrong with my entity model that for some reason the hibernate spec has been changed to allow in the later release.


      My entity model:



      public class CompanyCar implements Serializable {
            private Long id;
            private Employee employee;
            @Column(name = "id", nullable = false)
            public Long getID() {
                  return id;
            public void setID(final Long id) {
                  this.id = id;
            @OneToOne(mappedBy="car",optional = true, fetch = FetchType.LAZY)
            public Employee getEmployee() {
                  return employee;
            public void setEmployee(final Employee employee) {
                  this.employee = employee;
      public class EmployeeTeam implements Serializable {
            private String teamName;
            private Collection<Employee> members;
            @Column(name = "teamname", length = 30, nullable = false)
            public String getTeamName() {
                  return teamName;
            public void setTeamName(final String teamName) {
                  this.teamName = teamName;
            @OneToMany(mappedBy = "team")
            public Collection<Employee> getMembers() {
                  return members;
            public void setMembers(final Collection<Employee> members) {
                  this.members = members;
      public class Employee implements Serializable {
            private String employeeID;
            private CompanyCar car;
            private EmployeeTeam team;
            @Column(name = "employeeid", length = 36, nullable = false)
            public String getEmployeeID() {
                  return employeeID;
            public void setEmployeeID(final String employeeID) {
                  this.employeeID = employeeID;
            @OneToOne(optional = true, fetch = FetchType.LAZY)
            @JoinColumn(name = "companycarid", referencedColumnName = "id")
            public CompanyCar getCar() {
                  return car;
            public void setCar(final CompanyCar car) {
                  this.car = car;
            @ManyToOne(fetch = FetchType.LAZY)
                        name = "employeeteammembers", 
                        joinColumns = { @JoinColumn(name = "employee_fk", referencedColumnName ="employeeid") }, 
                        inverseJoinColumns = @JoinColumn(name = "team_fk", referencedColumnName = "teamname")
            public EmployeeTeam getTeam() {
                  return team;
            public void setTeam(final EmployeeTeam team) {
                  this.team = team;


      On inserting a CompanyCar:


                  final CompanyCar car = new CompanyCar();


      not-null property references a null or transient value: uk.co.exel.test.CompanyCar.employee


      On loading a CompanyCar:


      Invalid column name 'companycarid'


      The following SQL is generated by hibernate. It is attempting to join the CompanyCar directly to EmployeeTeam?


      select companycar0_.id as id0_, companycar0_1_.employee_fk as employee0_3_ 
      from companycars companycar0_ 
      left outer join employeeteams companycar0_1_ on companycar0_.id=companycar0_1_.companycarid


      Many thanks for any comments / suggestions.