Ebean的入门学习
1. 加密支持
(1)
你可以标记属性是通过EncryptDeployManager以编程方式进行加密,或者把@Encrypted注解的bean属性或两者的组合。
例如:
@Entity
@Table(name=”detail”)
public class Detail{
@Id
Integer id;
@Encrypted
String name;
//是否加密
@Lob
@Encrypted(dbEncryption =false)
String detail;
@Encrypted
Date dob;
...
}
(2)局限性
1.用java客户端加密的内容不能应用于“WHERE”子句
2.仅支持加密的DB,有H2、Postgres、MySql 和 Oracle.
3.您可以不使用加密和定位(1、2、3…)参数。您必须使用命名参数或criteria api定义的查询。
例如:
List
SQL结果:
Select u.id as c0, pgp_sys_decrypt(u.name,?) as c1 from usertable u where pgp_sys_decrypt(u.xxx,?)=?
(3)配置文件:
可以在ebean.properties文件中指定EncryptKeyManager实现,如下:
# ebean.properties - specify the Key Manager
ebean.encryptKeyManager=com.avaje.tests.basic.encrypt.BasicEncyptKeyManager
或者 通过配置 EeanServet的ServerConfig来设置EncryptKeyManager.如下:
// programmatically configure an EbeanServer
// with an EncryptKeyManager
ServerConfig config = ServerConfig();
...
EncryptKeyManager keyManager = ...;
config.setEncryptKeyManager(encyptKeyManager());
...
EbeanServer server = EbeanServerFactory.create(config);
(4)A EncryptKeyManager:
package com.avaje.tests.basic.encrypt;
import com.avaje.ebean.config.EncryptKey;
import com.avaje.ebean.config.EncryptKeyManager;
public class BasicEncyptKeyManager implements EncryptKeyManager {
/**
* Initialise the key manager.
*/
public void initialise() {
// can load keys or initialise source resources ...
}
public EncryptKey getEncryptKey(String tableName, String columnName) {
// get the key for the given table and column
String keyValue = ...;
return new BasicEncryptKey(keyValue);
}
}
2. Save/Delete
(1)Save是instert还是update要依赖它的状态。
如果是新建的:
User user = new User();
user.setName("han×××");
//insert the user
Ebean.save(user);
如果是获取来的bean,那就是更新了
User user = Ebean.find(User.class,2);
user.setName("lilei");
//update the user
Ebean.save(user);
(2)Save和Delete 将要 CASCADE 基于 CascadeType 明确到相关联的@OneToMany,@OneToOne etc注释。
默认的save和delete 不会cascade,所以需要指定一个cascadeType 让save()或者delete() 变为cascade.
例如:在对应的Bean模型中进行注释
@Entity
@Table(name="usertable")
Public calss User{
@ManyToOne
Name name;
@OneToMany(cascade=CascadeType.ALL)//表示save和updae同时对User和Detail两个作用。
List
...
//save the user 同时 saving the datail
Ebean.save(user);
(3)Delete和save用法一样,Ebean.delete();
例如:
User user = Ebean.find(User.class,12);
//delete the user
//CascadeType.ALL和CascadeType.REMOVE同样适用
Ebean.delete(user);
懒加载
当你设置懒加载性能时,一个局部项目会在你需求的时候懒加载剩下的数据。
// find order 12
// ... fetching the order id, orderDate and version property
// .... nb: the Id and version property are always fetched
Order order = Ebean.find(Order.class) .select("orderDate") .where().idEq(12) .findUnique();
// shipDate is not in the partially populated order
// ... so it will lazy load all the missing properties
Date shipDate = order.getShipDate();
// similarly if we where to set the shipDate
// ... that would also trigger a lazy load
order.setShipDate(new Date());
懒加载时,它会自动的加载填充已经设置属性的BEAN中没有数据的。
// find customer 1
// ... just fetch the customer id, name and version property
Customer customer = Ebean.find(Customer.class)
.select("name")
.where().idEq(1)
.findUnique();
customer.setName("CoolName");
Ebean.save(customer);
Sql语句:select c.id, c.name from or_customer c where c.id = ?
本文原创,已有几处论坛转载。