Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa Eben-ManyToOne映射积垢_Jpa_Orm_Playframework 2.0_Ebean - Fatal编程技术网

Jpa Eben-ManyToOne映射积垢

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

我有两个实体事务和类别与多通映射。所以很多交易都可以归入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 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,所以开销是不必要的。如果我错了,请告诉我,我只是无法理解,谢谢你的帮助!