似乎java变量上的@Basic
注释仅声明该变量必须保存为具有NOT NULL约束的列。那是对的吗 ?
此post表示@Basic(optional = false) @Column(nullable = false) The @Basic annotation marks the property as not optional on the Java object level. The second setting, nullable = false on the column mapping, is only responsible for the generation of a NOT NULL database constraint. The Hibernate JPA implementation treats both options the same way in any case, so you may as well use only one of the annotations for this purpose.
我很困惑。这是什么意思 - The @Basic annotation marks the property as not optional on the Java object level.
财产或变量如何"可选"在Java级别?
答案 0 :(得分:8)
api元素含义的权威答案当然是api文档,即javadoc。对于@Basic注释,这是writes:
到数据库列的最简单映射类型。 Basic注释可以应用于以下任何类型的持久属性或实例变量:Java原始类型,基本类型的包装,String,java.math.BigInteger,java.math.BigDecimal,java.util.Date, java.util.Calendar,java.sql.Date,java.sql.Time,java.sql.Timestamp,byte [],Byte [],char [],Character [],枚举以及任何其他实现java的类型。 io.Serializable。
对于这些类型的持久字段和属性,Basic注释的使用是可选的。如果未为此类字段或属性指定基本注释,则将应用基本注释的默认值。
Basic注释的值是什么? Javadoc也解释了他们:
public abstract FetchType fetch
(可选)定义字段或属性的值是应该延迟加载还是必须急切获取。 EAGER策略是持久性提供程序运行时的要求,必须急切地获取该值。 LAZY策略是对持久性提供程序运行时的提示。如果未指定,则默认为EAGER。
和
public abstract boolean optional
(可选)定义字段或属性的值是否为null。这是一个提示,被忽略了原始类型;它可以用于模式生成。如果未指定,则默认为true。
因此,如果将optional
设置为false
,则在尝试保留或更新属性为null的对象时,持久性提供程序可能会抛出异常。如果您的业务规则声明null不是合法值,则此功能非常有用。
注意强>
至少在使用hibernate时,可以使用相应的Bean Validation批注(@NotNull
)更好地表达可空性,因为这个批注既可以被hibernate理解,也可以被应用程序上的其他层使用(例如在验证时)用户输入)。
答案 1 :(得分:7)
Hibernate JPA实现只会在模式生成方面处理相同的内容,即使用非null约束创建列。
如果非可选字段为空,则使用optional = false但是也允许Hibernate(我想其他实现)执行检查并在刷新到数据库之前抛出异常。如果没有这个,你只会在尝试插入后抛出异常。
来自Pro JPA:
当可选元素指定为false时,它指示 提供者,字段或属性映射可能不为null。 API 实际上并没有定义当行为是什么时 value为null,但提供者可能会选择抛出异常或 干脆做别的事。对于基本映射,它只是一个提示和 可以完全忽略。可选元素也可以使用 进行模式生成时的提供者,因为,如果设置了可选项 为true,那么数据库中的列也必须是可空的。
使用optional = false也会影响Hibernate中的实体加载。例如,除非将关联标记为optional = false,否则单端关联总是在Hibernate中急切加载。
有关详细说明,请参阅:https://stackoverflow.com/a/17987718/1356423。