EJB3.0开发中的mappedBy用法

1、 mappedBy的用法:

①、如果两个实体Bean是双向多对多关联,在使用了mappedBy的一端我们称为关系目标方(方便起见,称为被控方),另一端称之为关系拥有方(方便起见,称为控制方)。相应的对象以下称之为主控对像和被控对象。注:佛山人出的那本书上对此的注释正好相返了。在6.6.3节,一对一映射中,原语如下:一对一关系需要在关系维护端(owner side)的@OneToOne注释中定义mappedBy 属性。在关系被维护端(inverseside)建立外键列指向关系维护端的主键列。

②、容器在根据上述的mappedBy关系建立临时表时,是以“主控表名_被控表名”的方式创建的。

③、在利用em.persist()方法新增主控对象,并且主控对像设置了被控对像的集合属性,则被控对象和主控对像的关联关系会增加到中间关联表。反过来增加被控对像,则关联关系不会增加在关联表中,除非利用merge方法修改被控对像。这就是mappedBy的用法。

④、举例说明:

[img]http://117.photo.pp.sohu.com/images/blog/2007/8/22/21/29/11527c8881f.jpg[/img]


以上三个类(除User)为双向多对多关系,实体之前没有任何级联关系。User依赖于Account,他们的级联关系为all,且为单向一对一的关系,User映射到Account.在TestCase中写如下代码:

PermissionManager manager = BeanLookup.getInstance().lookup(PermissionManager.class);

//和用户关联;

manager.addPermission("KEY_6", new Dialect("Permission6", "zh_CN"),

new Dialect("description6", "zh_CN"), null, null);

Permission permission = manager.getPermissionByKey("KEY_6");

assertNotNull(permission);

Account account = new Account();

account.setAccount("557");

account.setPassword("557");

account.getPermissions().add(permission);

User user = new User();

user.setAccount(account);

user.setName(new Dialect("name1", "zh_CN"));

user.setCreationTime(new Date());

UserManager userManager = BeanLookup.getInstance().lookup(UserManager.class);

userManager.addUser(user);

由于User和Account是级联保存的,所以Account在User新增的时候也会增加。如果在实体Bean中把Account设置为关系主控端,则上述写法会自动将account与permission的关联关系写入中间关联表。如果Account为关系被控端,则不会。(注意上述代码红色部份)或者手工去merger(permission)也能实现写入关联关系进中间表。

2、 在一个TestCase中通过Collection.getSize()方法去加载一个延迟的集合属性不起作用。这种方法只能在Session Bean中起作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值