JPA @Column和@Basic注释之间有什么区别?它们可以一起使用吗?如果他们可以一起使用吗?或者其中一个是否足够?
在JPA中,我很困惑何时使用属性optional=false和注释@Column(nullable=false).有什么不同?
我有一个表有另一个表的外键(多对一关系),但我希望它可以为空.
像这样的东西:
public class SubType() {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id;
}
public class TopUp {
@Column(nullable = true)
@ManyToOne(optional = false, fetch = FetchType.LAZY)
private SubType subType;
}
Run Code Online (Sandbox Code Playgroud)
但@Column(nullable = true)抛出NullPointerException并说子类型不能为空.有没有办法让ManyToOne接受null?
对于简单的字符串字段
@Entity
class Foo {
//1. @Basic(optional = false)
//2. @Column(length = 100, nullable = false)
String name;
}
Run Code Online (Sandbox Code Playgroud)
我需要使用@Column注释来限制名称的长度,但我对可以为空的属性感到困惑.虽然我正在使用其他注释@ManyToOne和@OneToMany那些使用optional属性,但我想@Basic(optional)用来保持大多数注释均匀.但我不能限制名称的长度@Basic.
那么,我应该在哪里注释可空属性,@Basic或者@Column?
编辑
简单地说,您更喜欢哪种形式:
表格1:
@Entity
class Foo {
@Basic(optional = false)
@Column(length = 100)
String name;
}
Run Code Online (Sandbox Code Playgroud)
表格2:
@Entity
class Foo {
@Column(length = 100, nullable = false)
String name;
}
Run Code Online (Sandbox Code Playgroud)
我个人喜欢Form 1,因为optional属性也被其他@ManyToOne注释使用,但是Form 2也很好,因为它是在单个注释中完成的.
编辑
阅读http://markmail.org/message/osod6rsauwbnkvya后,我@Basic.optional和之间有区别 …
我在JPA中有一个单表映射的继承,Say A类和B类扩展了一些抽象实体,所以我必须在A端使A&B的列可以为空,但是如果有人试图保持A,那么A的所有字段都应该是不为null,我想通过代码强制执行此操作.我可以使用以下代码来实现此目的 -
@Entity
@DiscriminatorValue("1")
public Class A extends SomeAbstractEntity{
@Basic(optional = false)
private String nameOfA;
}
Run Code Online (Sandbox Code Playgroud)
我在JPA中读到了@Basic(可选= false)与@Column(nullable = false)的答案,并认为这可能是可以实现的,但想知道什么是最好的方法.
在这三个选项中,我应该使用一个或两个或全部三个选项组合来防止空值?
@NotNull
@Column(name = "SOME_VALUE", nullable = false)
@Basic(optional = false)
private String someValue;
Run Code Online (Sandbox Code Playgroud)
请注意,我不认为这与现有问题重复。我看到许多 问题都询问这三个选项的子集,但尚未找到一个询问这三个选项中哪一个适合在现代 JPA/Hibernate 堆栈中使用的问题。
hibernate ×5
java ×5
jpa ×4
orm ×2
jpa-2.0 ×1
jsr ×1
many-to-one ×1
persistence ×1
validation ×1