首页 > 解决方案 > 如何使用多个 @Onetoone 和 @OnetoMany 注释

问题描述

我是 Spring Boot 的新手,第一次做一个实验性的应用程序。这个应用程序包含 3 个类/表:

帐户:

JournalEntryMaster:

日记条目详细信息:

我收到一个错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 
'entityManagerFactory' defined in class path resource 
[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation 
of init method failed; nested exception is org.hibernate.AnnotationException: @Column(s) not 
allowed on a @OneToOne property: com.accounts.entity.JournalEntryMaster.jvNumber

我可以理解错误是什么意思,但不幸的是我没有找到解决方案,所以我来到了这里。任何人都可以建议将不胜感激。

我复制以下实体:

帐号

public class Account {
@Id
@GeneratedValue

@Column(name="account_id")
private Long id;

@Column(name="account_number")
private Long accountNumber;

@Column(name="account_name")
private String accountName;

@Enumerated(EnumType.STRING)
@Column(name="dr_or_credit")
private DrOrCrSide drOrCrSide;

@Enumerated(EnumType.STRING)
@Column(name="account_type")
private AccountType accountType;

@ManyToOne(cascade = CascadeType.ALL)
private JournalEntryDetail journalEntryDetail;

JournalEntryMaster

@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@ToString
public class JournalEntryMaster {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="id")
private Long id;

@OneToOne
@Column(name="jv_number")
private Long jvNumber;

@Column(name="jv_master_date")
private Date Date;

@Column(name="jv_reference_no")
private String ReferenceNo;

@Column(name="memo")
private String Memo;

@Column(name="posted")
private boolean Posted;

@OneToMany(targetEntity = JournalEntryDetail.class, cascade = CascadeType.ALL)
private Set<JournalEntryDetail> journalEntryDetail = new HashSet<>();
}

旅程条目详情

@Entity
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode
@ToString

public class JournalEntryDetail {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(name="account_number")
private Long accountNumber;

@Enumerated(EnumType.STRING)
@Column(name="jv_detail_drcr")
private DrOrCrSide DrCr;

@Column(name="amount")
private Double Amount;

@Column(name="memo")
private String Memo;

@ManyToOne
@JoinColumn(name = "jv", referencedColumnName = "id")
private JournalEntryMaster jv;

@JoinColumn(name = "account_fk_jv", referencedColumnName = "account_number")
@OneToOne(targetEntity = Account.class, cascade = CascadeType.ALL)
private Account account_number;

@JoinColumn(name = "jvnumber_fk", referencedColumnName = "jv_number")
@OneToOne(targetEntity = JournalEntryMaster.class, cascade = CascadeType.ALL)
private JournalEntryMaster jvNumber;

标签: javaspringspring-boot

解决方案


public class JournalEntryMaster {
...
@OneToOne <-- remove this annotation
@Column(name="jv_number")
private Long jvNumber; 

Long用于jvNumber. 如果这只是一个数据库列并且与实体无关,请不要使用@OneToOne. 您可以删除注释,您的错误@Column(s) not allowed on a @OneToOne property: com.accounts.entity.JournalEntryMaster.jvNumber将消失。

另一方面,如果它与实体相关,则必须使用JoinColumn代替Column和使用您的EntityClass代替Long


推荐阅读