0

我在将数据从一侧关系插入到其他表和关系的另一侧时遇到问题

我有:具有用户实体的表用户

@Entity
@Column(name="USER")
public class User{


private int id;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="ID")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }


@ManyToMany
@Cascade(org.hibernate.annotations.CascadeType.ALL)
@JoinTable(name="USER_CARS_JOINTABLE", 
                joinColumns=@JoinColumn(name="USER_ID"),
                inverseJoinColumns=@JoinColumn(name="CARS_ID"))
public Cars userCars;

//set and get methods omitted

}

带有 Cars 实体的表 CARS

@Entity
   @Column(name="CARS")
   public class Cars{

    private int dateId;

    @Id
    @GeneratedValue(strategy=IDENTITY)
    @Column(name="DATE_ID")
    public int getDateId() {
        return dateId;
    }

    public void setDateId(int dateId) {
        this.dateId = dateId;
    }


   @ManyToMany
   @Cascade(org.hibernate.annotations.CascadeType.ALL)
   @JoinTable(name="USER_CARS_JOINTABLE", 
               joinColumns=@JoinColumn(name="CARS_ID"),
               inverseJoinColumns=@JoinColumn(name="USER_ID"))

   public User username;

   //set and get methods omitted

   }

如您所见,我在 USER 和 CARS 之间有一个 JoinTable“USER_CARS_JOINTABLE”,其中包含 User 和 Cars 表上的 FK。

我还将有表DESCRIPTION和实体类的名称描述:

@Entity
  @Column(name="DESCRIPTION")
  public class Description{

  private int id;

    @Id
    @GeneratedValue(strategy=IDENTITY)
    @Column(name="ID")
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }


  private String color;
  private String size;
  private String speed;
  private String type;

  //set and get methods omitted

  }

我的 JoinTable USER_CARS_JOINTABLE 是:

USER_ID INT NOT NULL,CARS_ID INT NOT NULL,DESCRIPTION_ID INT NOT NULL,主键(INSTITUTION_ID,DATE_ID,SRC_ID),约束 FK_USER_ID_IN_USER_CARS 外键(USER_ID)参考用户(ID),约束 FK_CARS_ID_IN_USER_CARS 外键(ID)参考 CA , CONSTRAINT FK_DESCRIPTION_ID_IN_USER_CARS FOREIGN KEY(DESCRIPTION_ID) REFERENCES DESCRIPTION(ID)

在我的情况下,用户可以拥有很多汽车,一种汽车可以属于多个用户。同样的汽车也可以有不同的描述。在类 Description 和 User Entity 和 Cars 实体之间,我将有一个 Undirected、JoinTable、OneToMany 关系。这意味着类 User 和 Cars 将知道 Description 类,但 Description 将不知道 User 和 Cars。当我尝试将数据从用户端到类 Cars 和类描述中设置到我的数据库中时,我将遇到如下异常:

休眠:插入到 USER_CARS_JOINTABLE(用户 ID,描述)值(?,?)错误:org.hibernate.util.JDBCExceptionReporter - 字段“Cars_ID”没有默认值错误:org.hibernate.event.def.AbstractFlushingEventListe ner -无法将数据库状态与会话同步

如果我从 Cars 方面执行此操作,我将遇到如下错误:

Hibernate:插入到 USER_CARS_JOINTABLE(Cars_ID,描述)值(?,?)错误:org.hibernate.util.JDBCExceptionReporter - 字段'User_ID'没有默认值错误:org.hibernate.event.def.AbstractFlushingEventListe ner -无法将数据库状态与会话同步

这意味着我的一些外键 JoinTable USER_CARS_JOINTABLE 没有获得 ID,因为我从无法生成或插入数据到这个可连接 USER_CARS_JOINTABLE 的一侧插入它,我不知道为什么?

如果我将为我的一些外键(如 User_ID 或 Cars_ID)添加到我的 JoinTable 数据库模式中,则默认“数字”比它有效,它是插入数据,但它总是会插入相同的数字,我输入“数字” . 但我想要的是,为我在 joinTable USER_CARS_JOINTABLE 中的一个问题外键提供与父表 User 或 Cars 相同的值!!!也许我可以在我的实体类中为我的 JoinTable 使用 Hibernate 中的一些 @Generator 注释。

谢谢你。

4

3 回答 3

0

我相信您的问题是因为您使用策略 IDENTITY 来生成您的 ID。尝试将其设置为 AUTO。

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="ID")
于 2013-05-18T19:38:19.107 回答
0

首先,您正在使用ManyToMany单个字段。最好有这样的东西:

在你的User课堂上:

@ManyToMany
@Cascade(org.hibernate.annotations.CascadeType.ALL)
@JoinTable(name="USER_CARS_JOINTABLE", 
            joinColumns=@JoinColumn(name="USER_ID"),
            inverseJoinColumns=@JoinColumn(name="CARS_ID"))
public List<Cars> userCars;

在你的Car课堂上,用户最好mappedBy

@ManyToMany(mappedBy = "userCars")
public List<User> usernames;

在这种情况下,您使这种关系是双向的,并避免了不必要的表(对于这种ManyToMany关系,一个表就足够了)

于 2013-05-18T12:29:25.257 回答
0

你的映射是错误的。双向关联总是有所有者方和反方。你让双方都成为所有者。反面不能包含映射信息(连接表、连接列),必须使用mappedBy属性标记为反面:

@ManyToMany(cascade = CascadeType.ALL, mappedBy = "userCars")
private User username;

请注意,您的代码还有其他几个问题:

  • 命名不好。汽车应该命名为汽车。用户名应命名为用户。userCars 应该被命名为汽车。
  • 用户名字段不应该是公开的,而是私有的
  • 注释应始终位于字段上,或始终位于 getter 上。您不能混合使用两种展示位置类型。如果这样做,其中一半将被 Hibernate 忽略
于 2013-05-18T10:51:24.217 回答