要么映射文件的hbm2那个值不是create,要么是ADDRESS类的class属性值得全类名错了
看看数据库生成是不是true,就是那个hbm2那个值
address包要写全 com.xxx.xxx.Address
我试了Address address 改成 Address address1 component 中的name=address 改成 name =address1没报错呢。
你重新定义个Student类 再在类生成出来的xml文件里修改就行
要的啊
由于上一个Test方法存入数据库的主键不为1,所以读的时候找不到信息
为了满足Javabean的书写规范
每个实体类必须都的符合javaBean的思想,属性私有,封装为get和set,有无参的构造,不知道你是不是这方面的错误
有的时候,你可能添加了几条属性,所以需要手动配置修改一下,
而且,直接生成的只是简单的映射关系,如果需要复杂的,当然要手动改一下了....
这里要求各实体类按照bean的要求来写,必须有一个无参构造函数,是一个标准要求。
是不是新加的属性的约束条件为not null?
解决方法:需要在<hibernate-mapping package="hibernate1">标签中加入所在的包名
Address这个属性要添加上get set方法,也就是不符合JavaBean 规范就会报错
1. 使用Hibernate Annotation来做对象关系映射
1) 添加必须包:
hibernate-jpa-2.0-api-1.0.0.Final.jar
2) 在实体类中添加JPA的标准注解来进行对象关系映射.注解可以添加在属性上,也可以添加在getXxx()方法之上。
a) @Entity 映射一个实体类
@Table 指定关联的表
b) @Id 映射OID
c) @GeneratedValue 指定OID的生成策略
d) @Version 映射版本号属性
e) @Column 指定属性对应的列的信息
f) @Temporal 指定日期时间的类型(TIMESTAMP,DATE,TIME)
g) 简单属性可以不用注解。默认就是@Basic
h) @Transient 指定属性不需要映射
i) 复杂属性:关联,继承,组件,联合主键,集合
3) 在Hibernate全局配置文件中使用声明映射类的方式:
<mapping class="实体类的全限定名"/>
4) 使用Annotation来映射对象关系时,加载Hibernate全局配置要使用AnnotationConfiguration类
5) 持久化操作与之前没有区别。
2. Hibernate Annotation 基本映射
3. 映射多对一
1) @ManyToOne
2) 指定关联列@JoinColumn(name="xxx_id")
4. 映射一对多
1) @OneToMany 默认会使用连接表做一对多的关联
2) 添加@JoinColumn(name="xxx_id")后,就会使用外键关联,而不使用连接表了。
5. 映射双向一对多
1) 在多端:
@ManyToOne
2) 在一端:
@OneToMany(mappedBy="多端的关联属性名"):----升级后--> @OneToMany
@JoinColumn(name="外键名")
6. cascade属性:指定级联操作的行为(可多选)
CascadeType.PERSIST :调用JPA规范中的persist(),不适用于Hibernate的save()方法
CascadeType.MERGE:调用JPA规范中merge()时,不适用于Hibernate的update()方法
CascadeType.REMOVE:调用JPA规范中的remove()时,适用于Hibernate的delete()方法
CascadeType.REFRESH:调用JPA规范中的refresh()时,适用于Hibernate的flush()方法
CascadeType.ALL:JPA规范中的所有持久化方法。
7. mappedBy属性:用在双向关联中,把关系的维护权反转
跟hibernate XML映射中的property-ref一样。
8. cascade属性和mappedBy用在一起时,一定要通过调用双方的set方法来建立关系。
10. 双向一对一
1) 基于外键
a) 在主控方:@OneToOne
b) 在被控方:@OneToOne(mappedBy="对方的关联属性名")
2) 基于主键: JPA标准中没有提供共享主键生成问题的标准方法,使用Hibernate的扩展
a) 在主控方:Car
@Id
@GeneratedValue(generator="my-uuid")
@GenericGenerator(name="my-uuid", strategy="uuid")
private String id;
@OneToOne(cascade={CascadeType.ALL})
@PrimaryKeyJoinColumn
private Brand brand;
b) 在被控方:Brand
@Id
@GeneratedValue(generator="myFG")
@GenericGenerator(name="myFG", strategy="foreign",parameters=@Parameter(name="property",value="car"))
private String id;
@OneToOne(mappedBy="brand")
private Car car;
11. 双向多对多
1. 在主控方:
//从学生到课程的多对多: 最好由某一端来维护这个关系会更有效率
@ManyToMany
@JoinTable(name="student_course",
joinColumns={@JoinColumn(name="student_id")},
inverseJoinColumns={@JoinColumn(name="course_id")})
private Set<Course> courseSet = new HashSet<Course>();
2. 在被控方:
//课程到学生的多对多
@ManyToMany(mappedBy="courseSet")
private Set<Student> stus = new HashSet<Student>();
12. 把双向多对多拆成两个一对多: 1-->*<--1
13. 继承映射:
1. 整个继承树一张表
在父类中添加从下注解
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="type",length=3)
@DiscriminatorValue("u")
子类中添加以下注解
@Entity
@DiscriminatorValue("w")
2. 每个子类一张表
在父类添加如下注解
@Entity
@Table(name="user")
@Inheritance(strategy=InheritanceType.JOINED)
在子类中跟普通实体类的映射相同
3. 每个具体类一张表
在父类中
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class User {
@Id
@GeneratedValue(strategy=GenerationType.TABLE,generator="xxGen")
@TableGenerator(name="xxGen",allocationSize=1)
private Long id;
...
}
在子类中跟普通实体类的映射相同
14. 组件映射
在组件类中用@Emabbedable
在使用这个组件类中用
@Emabbed
@AttributeOverrides({
@AttributeOverride(name="email", column=@Column(name="p_email")),
@AttributeOverride(name="address", column=@Column(name="p_address")),
@AttributeOverride(name="mobile", column=@Column(name="p_mobile"))
})
15. 联合主键映射
1. 主键类:用@Emabbedable映射。并实现Serializable接口,使用主键属性重写hashCode()和equals()方法。
2. 使用这个主键类的类中。用@Id映射。
首先Adress实体类 getter setter不全,会导致映射失败,另外报错光看这个有效信息太少,看出现红条的JUnit插件里面的报错会更准确目前看出来的就这些。
你的主键增长策略是: assigned吧
能不能把你源码贴出来看一下?好找有什么问题
类名错误,检查一下类名是否与映射文件一致
一:在JAVA中,重写构造函数必须先写一遍不带参数的构造方法
在该视频中,这里的POJO对象重写了构造函数.,所以必须写。
二:如果没有重写构造函数,可以不写无参构造函数,因为系统默认是有这个方法的
三:当new一个对象的时候,已经使用到了无参构造函数,例如:
Student student = new Student(); 这里new的时候已经使用了无参构造方法
我知道了,是class="com.imooc.students.Address"
真难,不知道
<component name="address" class="Address">这个 class="包.Address"要加上包名,应该就可以了
这个没法解释取出照片关闭了io,能正常通过。
public void testGetPicture() { Student s = (Student) session.get(Student.class, 1); Blob image = s.getPicture(); try { FileOutputStream out = new FileOutputStream("image/c1py.jpg"); InputStream in = image.getBinaryStream(); byte[] barray = new byte[1024]; int bytes; while ((bytes = in.read(barray, 0, barray.length)) > 0) { out.write(barray, 0, bytes); } out.close(); in.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
以上代码可以执行。
在实体类中定义好的
把Student类和Address类的代码也传上来看看吧,我当时就是student类里面忘了加getAddress方法了
hibernate.properties not found
我也碰到了这个问题,
<component name="address" class="test.Address"> <property name="postcode" column="POSTCODE"/> <property name="phone" column="PHONE"/> <property name="address" column="ADDRESS"/> </component>
<component name="address" class="test.Address">就好了,test改成你的包名。
不知道什么原因,可能哪里设置问题,或者版本不同了。
应该是因为老师的Address类和Students类在同一个文件夹下
如果Address和Students不在同一个文件下
test/Students.class
main/Address.class
那么
<compoent name="address" class="main.Address">
</compoent>