java hibernate注解映射类的字段可以和数据库中的字段不一致吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java hibernate注解映射类的字段可以和数据库中的字段不一致吗相关的知识,希望对你有一定的参考价值。

不一致指的是映射类的字段要多几个,数据库没有。
我以前都是使用对象映射文件的,第一次见到habernate注释映射

参考技术A 字段名当然可以与数据库字段不一样,但映射是的字段名必须一致 参考技术B 按照JPA2.0规范,不需要映射到数据库的字段,需要加@Transient注解,当然不加应该也是可以的,只是会警告吧 参考技术C 可以,只要映射文件写的一样就可以的。 参考技术D 当你添加@Transient注解之后, hibernate 就不会 把该数据 于数据表字段 进行映射

hibernate用注解配置实体类的映射

一、注解类

1. @Table

声明了该实体bean映射指定的表(table),目录(catalog)和schema名字

2. @Id

声明了该实体bean的标识属性(对应表中的主键)。

3. @Column

声明了属性到列的映射。该注解有如下的属性:

name 可选,列名(默认值是属性名)

unique 可选,是否在该列上设置唯一约束(默认值false)

nullable 可选,是否设置该列的值可以为空(默认值false)

insertable 可选,该列是否作为生成的insert语句中的一个列(默认值true)

updatable 可选,该列是否作为生成的update语句中的一个列(默认值true)

columnDefinition 可选,为这个特定列覆盖sql ddl片段(这可能导致无法在不同数据库间移植)

table 可选,定义对应的表(默认为主表)

length 可选,列长度(默认值255)

precision 可选,列十进制精度(decimal precision)(默认值0)

scale 可选,如果列十进制数值范围(decimal scale)可用,在此设置(默认值0)

4. @GeneratedValue

声明了主键的生成策略。该注解有如下属性:

strategy 指定生成的策略(JPA定义的),这是一个GenerationType。默认是GenerationType. AUTO

GenerationType.AUTO 主键由程序控制

GenerationType.TABLE 使用一个特定的数据库表格来保存主键

GenerationType.IDENTITY 主键由数据库自动生成(主要是自动增长类型)

GenerationType.SEQUENCE 根据底层数据库的序列来生成主键,条件是数据库支持序列。这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中的序列)。

5. GenericGenerator

声明了一个hibernate的主键生成策略。支持十三种策略。该注解有如下属性:

name 指定生成器名称。

strategy 指定具体生成器的类名(指定生成策略)。

parameters 得到strategy指定的具体生成器所用到的参数。

6. @Transient

声明了非持久化属性,即数据库中没有相应的映射字段,是一个普通属性。

7. @Temporal

声明了日期类型。

TemporalType.DATE 日期,例:2011-04-12

TemporalType.TIME 时间,例:22:50:30

TemporalType.TIMESTAMP 日期和时间,例:2011-04-12 22:51:30

二、看例子

Role.class

@Entity
@Table(name="role")
public class Role implements Serializable{

    private String roleId;
    private String roleName;
    @Id
    @Column(name="roleid")
    @GenericGenerator(name="generator", strategy = "uuid.hex")
    @GeneratedValue(generator="generator")
    public String getRoleId() {
        return roleId;
    }
    public void setRoleId(String roleId) {
        this.roleId = roleId;
    }
    @Column(name="rolename")
    public String getRoleName() {
        return roleName;
    }
    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }
    
}

Student.class

@Entity        
@Table(name="student")    
public class Student implements Serializable{
    
    private String stuId;
    private String stuName;
    private Role role;
    
    @Id
    @Column(name="stuid")
    @GenericGenerator(name="generator",strategy="uuid.hex")
    @GeneratedValue(generator="generator")
    public String getStuId() {
        return stuId;
    }
    public void setStuId(String stuId) {
        this.stuId = stuId;
    }
    @Column(name="stuno")
    public String getStuNo() {
        return stuName;
    }
    public void setStuNo(String stuNo) {
        this.stuName = stuNo;
    }
}

三、在spring容器的配置

实体类写好之后,需要在spring容器中加载,在配置sessionFactory时进行配置,有两种配置的方式

1、使用annotatedClasses

        <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" />  
            <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            </props>
        </property>
        <!-- <property name="packagesToScan"  value="com.demo.entity"/> -->
        <property name="annotatedClasses">
            <list>
                <value>com.demo.entity.Role</value>
                <value>com.demo.entity.Student</value>
            </list>
        </property>
    </bean> 

2、使用packagesToScan直接对实体类进行扫描

        <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">  
        <property name="dataSource" ref="dataSource" />  
            <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            </props>
        </property>
        <property name="packagesToScan"  value="com.demo.entity"/>
    </bean>

 

以上是关于java hibernate注解映射类的字段可以和数据库中的字段不一致吗的主要内容,如果未能解决你的问题,请参考以下文章

Java自定义注解注解实现实体类与数据库表字段的映射

hibernate用注解配置实体类的映射

[Hibernate] 注解映射例子

Hibernate注解映射联合主键的三种主要方式(转载)

Hibernate - 使用注解完成映射

Hibernate学习笔记 --- 使用注解定义ORM配置