简体   繁体   English

hibernate复合键映射外键问题

[英]hibernate composite key mapping foreign key issue

this is my mysql db 这是我的mysql数据库

user.java user.java

@Entity
@Table(name="user")

public class user 
{

   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)

   private int uid;

   @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy ="user")
   private Set<order> orders = new HashSet<order>();
   //
   setter ,getter  ,and other 
}

order.java order.java

@Entity
@Table(name="`order`")
public class order 
{
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private int oid;

   @OneToMany(cascade = CascadeType.ALL)
   @JoinColumn(name="oid", referencedColumnName="oid" )
   private Set<orderitem> orderitems = new HashSet<orderitem>();

   @ManyToOne(cascade=CascadeType.ALL)
   @JoinColumn(name="uid")
   private user user ;

   /////
   setter ,getter and other

}

orderitem.java orderitem.java

@Entity
@Table(name="orderitem")
public class orderitem 
{
   @EmbeddedId
   private orderitem_PK PK; //composite key

   @ManyToOne
   @JoinColumn(name="oid", referencedColumnName="oid" ,insertable = false, updatable = false)
   private order order;

   @ManyToOne
   @JoinColumn(name="pid", referencedColumnName="pid", insertable = false, updatable = false)
   private product products ;

   ////
   setter,getter and other
}

orderitem_PK.java orderitem_PK.java

@Embeddable
public class orderitem_PK implements Serializable
{

    private int oid;
    private int pid;
    public orderitem_PK() {}

    public orderitem_PK(int oid, int pid) {
        this.oid = oid;
        this.pid = pid;
    }

    // equals, hashCode

    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
        return super.equals(obj);
    }

    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return super.hashCode();
    }

and last product.java 和上一个product.java

@Entity
@Table(name="product")
public class product 
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int pid;

    @OneToMany(cascade = CascadeType.ALL )
    @JoinColumn(name="pid", referencedColumnName="pid" )
    private Set<orderitem> orderitems = new HashSet<orderitem>();

     //////////
        setter,getter and other

}

it is a online shopping page 这是一个在线购物页面

I'm trying to insert data by this code 我正在尝试通过此代码插入数据

             order order = new order();
             order.setUser(user);
             order.setOrdertotal(product.getPrice());

             Date dt = new Date();
             DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             String nowTime = df.format(dt);
             java.sql.Timestamp buydate = java.sql.Timestamp.valueOf(nowTime); 

             order.setOrderdate(buydate);

             /// delete this part will work 
             orderitem orderitem = new orderitem();
             orderitem.setOrder(order);
             orderitem.setProducts(product);
             orderitem.setQuantity(product.getQuantity());
             orderitem.setPrice(product.getPrice());

             ////

             session.save(order);
             session.save(orderitem);

encounter some error. 遇到一些错误。

org.hibernate.id.IdentifierGenerationException: null id generated for:class Model.orderitem org.hibernate.id.IdentifierGenerationException:为以下内容生成的null id:class Model.orderitem

when I only save user and order part the code is work . 当我只保存用户和订单部分代码是工作。

after add save orderitem code , the problem occurred. 添加保存orderitem代码后,出现问题。

i think composite key mapping foreign key is wrong. 我认为复合键映射外键是错误的。

but I don't know how to fix it . 但我不知道如何解决它。

Can anybody spot what I'm doing wrong? 谁能发现我做错了什么?

thanks. 谢谢。

You need to map both oid and pid in your EmbeddedId using @MapsId. 您需要使用@MapsId在EmbeddedId中映射oid和pid @MasId provides the mapping for an EmbeddedId primary key or a simple primary key of the parent entity. @MasId提供EmbeddedId主键或父实体的简单主键的映射。 Make the following changes in your orderItem Entity. 在orderItem实体中进行以下更改。

@Entity
@Table(name="orderitem")
public class orderitem 
{
   @EmbeddedId
   private orderitem_PK PK; //composite key

   @ManyToOne
   @MapsId("oid") // maps the order id attribute of embedded id
   @JoinColumn(name="oid", referencedColumnName="oid" ,insertable = false, updatable = false)
   private order order;

   @ManyToOne
   @MapsId("pid") // maps the product id attribute of embedded id
   @JoinColumn(name="pid", referencedColumnName="pid", insertable = false, updatable = false)
   private product products ;

   ////
   setter,getter and other
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM