【问题标题】:Ebean ManyToOne Mapping CRUDEbean 多对一映射 CRUD
【发布时间】:2013-05-12 12:27:57
【问题描述】:

我有两个带有多对一映射的实体事务和类别。这么多交易都可以归为有类别。

@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

}

现在,当我两次添加具有相同 catName 的两个事务时,它会在 catName 上引发唯一约束失败。如果 CatName 已经存在(而不是总是尝试插入),有什么方法可以指示 Ebean 合并类别?

考虑到以下几点,这种映射方法是否正确:
如果我删除Transaction,对应的Category不应该被删除,因为它可能被其他Transactions引用。

感谢您的帮助!

【问题讨论】:

    标签: jpa orm playframework-2.0 ebean


    【解决方案1】:

    我认为您在 Category 模型上的注释有误。如果要列出与任何Category 数据对应的所有Transaction 数据。你应该用@OneToMany@ManyToMany 来标记它。当您将TransactionCategory 的关系标记为多对一关系 时,这意味着每个Transaction 都有一个 Category 关联。 p>

    // This means every transaction has exactly one category associated 
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="cat_id", referencedColumnName="cat_id")
    public Category cat; 
    

    CategoryTransaction 之间的关系应该是一对多。下面的代码是如何修复模型的指导:

    @Entity
    @Table(name = "category")
    public class Category extends Model {
        @Id
        @Column(name="cat_id")
        public Long catId;
    
        @Column(unique=true)
        public String catName;
    
        // This means one category can have many transaction associated
        @OneToMany(mappedBy = "cat")
        public List<Transaction16507336> transactions;
    }
    

    它应该允许你用相同的Category 保存不同的Transaction 对象。希望对你朋友有用。 :)


    更新

    CategoryTransaction 模型现在具有双向关系,这意味着如果您有 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();
    

    注意:This reference 可能对您有用。

    【讨论】:

    • 感谢 Wayan,我在找到您提到的参考资料后解决了这个问题。但是还有另一个问题,当我添加另一个具有相同 CatId 和 CatName 的事务时,我在 catId 上遇到 PK 违规。我猜 EBean 不够聪明,无法合并从 Transaction 到 Category 的 ManyToOne 关系。我使用的一个解决方案是在保存交易之前获取类别,然后保存交易。这种方法正确吗?
    • 每个new SomeModel()表达式总是告诉Ebean创建新记录,所以如果你分配你新创建的Category即使它已经在数据库中,Ebean总是尝试插入记录。而且..是的,朋友,您的方法是正确的。祝你有美好的一天。
    • 对不起,在这里问一些无关的东西,我只是 Ebean 的新手,对它持久存在实体的方式感到奇怪。比如说,如果我想创建一个类别的事务,我必须先获取,考虑到底层 sql 表只需要类别的 id,开销是不必要的。如果我错了请告诉我,我就是无法理解,谢谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多