Jpa Eben-ManyToOne映射积垢
我有两个实体事务和类别与多通映射。所以很多交易都可以归入have类别Jpa Eben-ManyToOne映射积垢,jpa,orm,playframework-2.0,ebean,Jpa,Orm,Playframework 2.0,Ebean,我有两个实体事务和类别与多通映射。所以很多交易都可以归入have类别 @Entity class Transaction extends Model{ @Id public Long id; @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name="cat_id", referencedColumnName="cat_id") public Category cat; } @Entity class Category
@Entity
class Transaction extends Model{
@Id
public Long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="cat_id", referencedColumnName="cat_id")
public Category cat;
}
@Entity
class Category extends Model{
@Id
@Column(name="cat_id")
public Long catId;
@Column(unique=true)
public String catName;
@ManyToOne
public List<Transaction> transactions
}
@实体
类事务扩展模型{
@身份证
公共长id;
@多通(级联=级联类型.ALL)
@JoinColumn(name=“cat\u id”,referencedColumnName=“cat\u id”)
公共类别猫;
}
@实体
类类别扩展模型{
@身份证
@列(name=“cat_id”)
公共长catId;
@列(唯一=真)
公共字符串catName;
@许多酮
公开清单交易
}
现在,当我两次添加两个具有相同catName的事务时,它会对catName抛出唯一约束失败。如果CatName已经存在(而不是总是尝试插入),我是否可以指示Ebean合并类别
考虑到以下几点,这种映射方法是否正确:如果我删除交易,则不应删除相应的类别,因为它可能会被其他交易引用
谢谢你的帮助 我认为您对
类别
模型的注释有误。如果要列出与任何类别
数据对应的所有事务
数据。您应该用@OneToMany
或@ManyToMany
标记此项。当您将您的交易
与类别
的关系标记为多对一关系时,意味着每个交易
都有一个类别与之关联
// This means every transaction has exactly one category associated
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="cat_id", referencedColumnName="cat_id")
public Category cat;
类别
与交易
之间的关系应为一对多。下面的代码是如何修复模型的指南:
@实体
@表(name=“category”)
公共类类别扩展模型{
@身份证
@列(name=“cat_id”)
公共长catId;
@列(唯一=真)
公共字符串catName;
//这意味着一个类别可以有多个关联的事务
@OneToMany(mappedBy=“cat”)
公开上市交易;
}
它应该允许您使用相同的类别保存不同的事务
对象。希望对你的朋友有用。:)
更新
Category
和Transaction
模型现在具有双向关系,这意味着如果您有Category
对象,您也可以有关联的Transaction
对象,反之亦然。要保存模型,可以采用以下方法:
Category cat1 = Ebean.find(Category.class, 1L); // fetch category that exsist
Transaction t1 = new Transaction(); // this is new transaction
t1.cat = cat1; // cat1 category
t1.save();
Transaction t2 = new Transaction(); // this is new transaction
t2.cat = cat1; // cat1 category
t2.save();
注意:可能对您有用
谢谢Wayan,我在找到你提到的参考资料后修复了它。然而,还有一个问题,当我添加另一个具有相同CatId和CatName的事务时,我在CatId上得到PK冲突。我猜Ebian不够聪明,无法合并交易和类别之间的case-to-Manytone关系。我使用的一种解决方案是在保存事务之前获取类别,然后保存事务。这种方法正确吗?每个new SomeModel()
表达式都会告诉Ebean创建新记录,因此,如果您分配新创建的类别
,即使它已经在数据库中,Ebean也会尝试插入该记录。和。。是的,朋友,你的方法是正确的。祝你有一个愉快的一天。很抱歉在这里问一些不相关的问题,我只是埃宾的新手,对它持续存在的方式感到奇怪。比如说,如果我想创建一个类别的事务,我必须首先获取,并且考虑到底层sql表只需要类别的id,所以开销是不必要的。如果我错了,请告诉我,我只是无法理解,谢谢你的帮助!