918是什么星座| 现在最火的歌是什么| 为什么总是想吐| 什么叫低级别上皮内瘤变| 喉咙有痰是什么原因引起的| 后话是什么意思| 什么是色拉油| 苍耳是什么| 肾疼挂什么科| 水加人念什么| 三个耳读什么| 大堤是什么意思| 棘突是什么意思| 单核细胞偏高说明什么| 副军级是什么级别| o型血不能和什么血型的人生孩子| 氯雷他定片主治什么病| 菊花泡水喝有什么好处| 手抽筋吃什么药| 斤是什么单位| 针眼是什么| 脑白质变性是什么病| 吹牛皮是什么意思| 光绪帝叫什么名字| 怀孕时间从什么时候开始算| 梦见很多猪是什么意思| 稻谷是什么| 梦见下雪是什么征兆| 人上人是什么意思| 什么的木筏| 公章一般是什么字体| 肽是什么东西| 肺部有阴影是什么原因| 诸是什么意思| 血管没有弹性是什么原因| 化疗期间吃什么好| lgbtq是什么意思| 一身傲骨是什么意思| 什么富什么车| dr是什么| 葡萄糖高是什么原因| 长智齿意味着什么| 幽门杆菌的症状是什么| 地中海是什么意思| 血小板减少有什么危害| 脑萎缩吃什么药能控制| 脱髓鞘疾病是什么病| 孕妇前三个月吃什么对胎儿好| 判决书什么时候生效| 落红的血是什么样子的| 射精是什么感觉| 清酒是什么酒| 为什么脚底会脱皮| ptc是什么| 梦见筷子是什么预兆| 皮肤湿疹用什么药膏| 乳房突然疼痛什么原因| 花中四君子是什么| 石棉是什么| 湿热吃什么食物好得快| 100分能上什么大学| 炖排骨放什么调料| 阳历3月是什么星座| 近视用什么镜矫正| 吃什么能增肥| 鳡鱼是什么鱼| 鸟对什么| 什么空如什么| nice什么意思| 北京居住证有什么用| 玉兔是什么意思| 过渡句的作用是什么| 用盐水洗脸有什么好处| 大便带血是什么原因男| 鸡蛋胶是什么鱼胶| 上热下寒吃什么食物好| 陌陌是干什么的| 新疆有什么湖| 叶酸有什么好处| 梦见下雪了是什么意思| ram是什么动物| 天津副市长什么级别| 龋齿挂什么科| 忽然心口疼是什么原因| 2004属什么生肖| 两点水的字和什么有关| 多金是什么意思| 腰痛宁为什么晚上吃| pca是什么意思| 隔天是什么意思| 江西简称是什么| 宫颈管少量积液是什么意思| 木木耳朵旁是什么字| 2005属什么| 画皮是什么意思| 糖类抗原125偏高说明什么| 见色起意是什么意思| 6.8是什么星座| 糟卤对身体有什么危害| 夏至为什么吃馄饨| 类风湿性关节炎用什么药| 淋巴结肿大是什么原因引起的| 剖腹产坐月子可以吃什么水果| beryl是什么意思| 双相是什么| 春天有什么水果| 大难不死的生肖是什么| 西晋之后是什么朝代| 什么饮料好喝又健康| 盗汗吃什么药效果最快| 跳梁小丑指什么生肖| 女性支原体阳性是什么意思| 练瑜伽有什么好处| 伊玛目是什么意思| 葡萄什么时候传入中国| 耳朵不舒服是什么原因| 瘫痪是什么意思| geforce是什么牌子| 胆红素三个指标都高是什么原因| 鳄鱼的天敌是什么| 过生日送什么礼物| 金鱼吊兰什么时候开花| 对辣椒过敏有什么症状| 腹泻吃什么水果好| 12月23日是什么星座| 贡眉是什么茶| aq是什么| 金棕色是什么颜色| 心衰吃什么药| 怀孕尿液是什么颜色| 甘草不能和什么一起吃| 血压低什么症状| 肿瘤标志物五项检测是什么| 上位是什么意思| 在家做什么小生意| 码是什么单位| 爱屋及乌是什么意思| 疰夏是什么意思| 天团是什么意思| 3月22日什么星座| 尿蛋白两个加号是什么意思| jw是什么意思| 新生儿甲状腺偏高有什么影响| 狗生小狗前有什么征兆| 乙肝需要检查什么项目| 阿昔洛韦片治什么病| 克是什么意思| 香港为什么不用人民币| 什么是健康证| 小白兔是什么意思| 调经吃什么药效果最好| 嗓子苦是什么原因引起的| 阎王爷姓什么| 丙肝病毒抗体阴性是什么意思| 谷氨酰转移酶高是什么病| 1025是什么星座| 万里晴空什么意思| 冻豆腐炖什么好吃| 魂牵梦绕是什么意思| 土字旁有什么字| 广西北海有什么好玩的地方| 巨蟹座男和什么座最配对| 黄鼠狼喜欢吃什么东西| 整装待发是什么意思| 唯字五行属什么| 十一月九号是什么星座| zv是什么品牌| 秋葵是什么| 猫牙米是什么米| 毫不逊色的意思是什么| 甲肝戊肝是什么病| 白带黄什么原因| 三牛读什么| 脚气长什么样| 郡肝是什么部位| 长方形脸适合什么发型| 护肝养肝吃什么好| 梦见血是什么预兆解梦| 什么叫传统文化| 属马的生什么属相的宝宝好| 上升水瓶座为什么可怕| 嘴里发甜是什么原因| 戒指戴左手中指是什么意思| 越五行属性是什么| 木耳属于什么类| 甲鱼吃什么| 咽干是什么原因造成的| 人乳头瘤病毒51型阳性是什么意思| 什么时候验孕最准确| 男人喝红糖水有什么好处| 什么的散步| 胸口疼应该挂什么科| 香港脚是什么症状图片| 麻雀长什么样| 吃什么可以变胖| 岁月如歌是什么意思| 双相情感障碍是什么病| 大姨妈延迟是什么原因| 大运正官是什么意思| hr什么意思| 祝好是什么意思| 长黑斑是什么原因引起的| 月经期喝什么汤好| s.m是什么意思| olay是什么品牌| 什么东西清肺止咳| 拉肚子为什么会肚子疼| 孕妇梦到老公出轨什么意思| 继发性闭经是什么意思| 东施效颦是什么意思| 牙套什么材质的好| 甲肝阳性是什么意思| 扁平足适合穿什么鞋| 闰六月是什么意思| disease是什么意思| 宝五行属什么| hla一b27阳性是什么意思| 故宫什么时候闭馆| 胃酸反流是什么原因造成| 鹅口疮是什么原因引起的| 小孩胃疼吃什么药好| img是什么意思| 本能反应是什么意思| 宝宝什么时候可以吃盐| 胳膊肘发黑是什么原因| 土耳其是什么民族| 谨遵医嘱是什么意思| 孤单的我还是没有改变是什么歌| 麻腮风疫苗是预防什么| 1r是什么意思| 老年人缺钾吃什么好| 狗狗为什么会咬人| 乳牙是什么| 深井冰是什么意思| 过度纵欲的后果是什么| 射手属于什么象星座| 阑珊什么意思| 刺五加配什么药治失眠| 甘油三酯高吃什么药效果好| 大便想拉又拉不出来是什么原因| 双相情感障碍什么意思| 都字五行属什么| 舌头干是什么原因| 乳酸杆菌少或无是什么意思| 疡是什么意思| 根管治疗后要注意什么| 汗毛重是什么原因| hkc是什么牌子| 伤官配印是什么意思| 韧带和筋有什么区别| 少将属于什么级别| 低压高用什么药| 炖肉放什么调料| 鬼打墙是什么意思| 尿液黄绿色是什么原因| 1是什么数| 为什么会甲亢| 鼻窦炎有什么特效药| 睡觉口干舌燥什么原因| 嗜酸性粒细胞偏高是什么原因| 毒瘾发作是什么感觉| 地级市副市长是什么级别| 脑瘤到什么程度才会死| 杞子配什么增强性功能| 百度
BT

Facilitating the Spread of Knowledge and Innovation in Professional Software Development

Write for InfoQ

Topics

Choose your language

InfoQ Homepage Articles Jakarta EE 11 Overview: Virtual Threads, Records, and the Future of Persistence

车讯情报上汽奥迪正常推进 采用创新模式年内

Listen to this article -  0:00

Key Takeaways

  • Jakarta EE 11 introduces a new specification, Jakarta Data, with updates to 16 specifications and a fresh, updated Technology Compatibility Kit.
  • The release of Jakarta EE 11 was delayed to focus on modernizing the Technology Compatibility Kit (TCK) for improved compatibility testing and lowering the barrier for adding more tests as the Jakarta EE ecosystem grows and evolves.
  • Jakarta EE 11 now requires Java 17 as a minimum version and support for Java 21, bringing support for new features such as Java records and virtual threads.
  • Jakarta EE 12 will feature advancing capabilities in data management.
  • The Jakarta Persistence, Jakarta Validation and Jakarta Expression Language specifications include support for Java records.
  • The Jakarta Concurrency specification supports the use of Virtual Threads via a modification to a single attribute when using Java 21.

Jakarta EE 11 is now available, delivering additional features and capabilities for improving software developer productivity and enabling further innovation. So you may be asking, "What's new in this version?" and "What comes next?" This article will address these questions. 

Jakarta EE, formerly known as Java EE, stands for the Jakarta Enterprise Edition and its associated specifications. It is an open-source ecosystem containing thirty active specifications in the Jakarta EE 11 Platform. You can think of a specification as a unit or a component within the ecosystem. 

For example, Jakarta Persistence is a specification for handling relational databases, while Jakarta Contexts and Dependency Injection (CDI) is a specification for injecting dependencies within your application. The Jakarta EE 11 Web Profile and Jakarta EE 11 Core Profile are subsets of the Jakarta EE 11 Platform that we will cover later in this article.

Thus, as a Java developer, you are already using the Jakarta EE platform, regardless of whether you are using Spring, Quarkus, Helidon, Open Liberty, Payara, or Tomcat. For example, when you use servlets in your application, you are using the Jakarta Servlet specification.

The Spring ecosystem uses Jakarta EE as a dependency. For example, Spring Data relies on the Jakarta Persistence specification.

The Jakarta EE Working Group decided to delay the release of Jakarta EE 11 to focus on modernizing the Technology Compatibility Kit (TCK). Benefits for having made this investment include improved compatibility testing and a lowered barrier for adding more tests as the Jakarta EE ecosystem grows and evolves.

Now that we have provided an overview of the Jakarta EE ecosystem and why it is relevant for the Java community, let’s discuss what's new in Jakarta EE 11.

What's New in Jakarta EE 11?

Jakarta EE 11 marks a significant step forward in simplifying enterprise Java with a focus on increasing developer productivity and performance. Key highlights include the introduction of the new Jakarta Data specification, Java 17 as a minimum requirement, support for Java 21, and updates to sixteen specifications. The TCK was also updated featuring migrations from Ant to Maven and TestHarness to Arquillian.

This release provides improved integration with Java records on several specifications, such as Jakarta Persistence, Jakarta Validation, and Jakarta Expression Language, as well as support for virtual threads in Jakarta Concurrency when using Java 21.

Figure 1 below shows the specifications under the Jakarta EE Platform, Web Profile and Core Profile. As you can see, Jakarta Data is the new specification and updates to sixteen specifications, such as Jakarta CDI 4.1 and Jakarta Persistence 3.2.

Figure 1: The Jakarta EE specifications under the Platform, Web Profile and Core Profile.

The strategy of continually increasing integration among platforms has been established. Jakarta EE 11 evolves context and dependency injection with the removal of the Jakarta Managed Beans specification in favor of CDI alternatives. Furthermore, this version also removed all references to Security Manager that was deprecated in Java 17 and permanently disabled in Java 24. This opens up space for more modern security capabilities within Jakarta EE. Moreover, this version also removed optional features, such as Jakarta SOAP with Attachments, Jakarta XML Binding, and Jakarta XML Web Services, primarily to simplify the experience for new vendors within the platform.

When Jakarta EE enables Java 17 as a minimum requirement supporting Java 21, it is natural to expect integration and capabilities with the recent, more popular new features of Java SE: Java records and virtual threads.

Let’s start with Java records. First, let’s consider this Driver data structure:

public record Driver(String name, String document, Integer age) {
}

Now, let’s apply some validation using annotations provided by the Jakarta Validation specification. We want to ensure that the name and document parameters cannot be blank with a specified minimum and maximum size. Then, we can assert a minimum age to ensure that people under sixteen years old cannot drive.

public record Driver(@NotBlank @Size(min = 5, max = 50)String name,
?@NotBlank @Size(min = 5, max = 50) String document,
?@Min(16)Integer age) {
}

With Jakarta Persistence, you can use Java records as embedded classes and as IDs. However, there is no support in the specification for Java records and entities. We can now use the @Embeddable annotation to organize the code structure more effectively, particularly the immutable part. For example, consider an address that generally doesn’t change, but if it does change, all the attributes of an address, that is, the city, street, and zip code will need to change. The code below shows a sample of the usage of Java records with Jakarta Persistence:

@Embeddable
public record Address(String street, String city, String zipCode) {}

@Entity
public class Customer {

? ? @Id
? ? @GeneratedValue
? ? private Long id;

? ? private String name;

? ? @Embedded
? ? private Address address;

}

We can also use the @Embedded annotation as a composite key. Thus, you can use it on the newest Jakarta EE projects. For example, given an order item with a composite key that combines the order and the product, we can now use this structure as a record. This is shown in the code below.

@Embeddable
public record OrderItemId(Long orderId, Long productId) implements Serializable {}

@Entity
public class OrderItem {

? ? @EmbeddedId
? ? OrderItemId id;

? ? int quantity;

? ? @ManyToOne(fetch = FetchType.LAZY)
? ? @MapsId("orderId")
? ? Order order;
}

@Entity
public class Order {

? ? @Id
? ? @GeneratedValue
? ? Long id;

? ? String customerName;

? ? @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
? ? List<OrderItem> items;
}

In Jakarta EE 11, you can also utilize virtual threads. The Jakarta Concurrency specification provides a straightforward way to enable virtual threads in your code. This is accomplished by simply setting a boolean flag in the @ManagedExecutorDefinition annotation. The sample code below demonstrates the creation of two CDI qualifiers: one using virtual threads and the second using the platform thread.

@Qualifier
@Retention(RUNTIME)
@Target({ FIELD, METHOD, PARAMETER, TYPE })
public @interface WithVirtual {}
@Qualifier
@Retention(RUNTIME)
@Target({ FIELD, METHOD, PARAMETER, TYPE })
public @interface WithoutVirtual {}
@ManagedExecutorDefinitions({
? ? @ManagedExecutorDefinition(
? ? ? ? name = "java:module/concurrent/ExecutorWithVirtual",
? ? ? ? context = "java:module/concurrent/ContextWithVirtual",
? ? ? ? qualifiers = WithVirtual.class,
? ? ? ? virtual = true,
? ? ? ? maxAsync = 10,
? ? ? ? hungTaskThreshold = 10000
? ? ),
? ? @ManagedExecutorDefinition(
? ? ? ? name = "java:module/concurrent/ExecutorWithoutVirtual",
? ? ? ? context = "java:module/concurrent/ContextWithoutVirtual",
? ? ? ? qualifiers = WithoutVirtual.class,
? ? ? ? virtual = false,
? ? ? ? maxAsync = 5,
? ? ? ? hungTaskThreshold = 20000
? ? )
})
@ContextServiceDefinition(
? ? name = "java:module/concurrent/ContextWithVirtual",
? ? propagated = {SECURITY, APPLICATION}
)
@ContextServiceDefinition(
? ? name = "java:module/concurrent/ContextWithoutVirtual",
? ? propagated = {SECURITY, APPLICATION}
)
public class ConcurrencyConfig {
}
@ApplicationScoped
public class TaskService {
? ? @Inject
? ? @WithVirtual
? ? ManagedExecutorService virtualExecutor;
? ? @Inject
? ? @WithoutVirtual
? ? ManagedExecutorService platformExecutor;
? ? public void runWithVirtual() {
? ? ? ? virtualExecutor.execute(() ->
? ? ? ? ? ? System.out.println("[VIRTUAL] running in: " + Thread.currentThread())
? ? ? ? );
? ? }
? ? public void runWithPlatform() {
? ? ? ? platformExecutor.execute(() ->
? ? ? ? ? ? System.out.println("PLATFORM] running in: " + Thread.currentThread())
? ? ? ? );
? ? }
}

Finally, Jakarta Data, the new specification in Jakarta EE 11, provides capability at the persistence layer, making it easier to access both SQL and NoSQL databases using a single interface. This is similar to using Spring Data for those familiar with it.

With Jakarta Data, you can generate queries, data modifications, and two types of paginations: offset and cursor. Using an interface and a couple of simple instructions, the provider will do the work of converting this for you. With the built-in repository interfaces, which you use to generate an interface, Jakarta Data extends from a hierarchy interface or a custom interface that produces the actions and terminology from scratch.

For example, the code below defines a CarRepository interface, where we extend from the built-in BasicRepository interface. As a result, the CarRepository provides several action methods, such as save, delete, and others.

@Repository
public interface CarRepository extends BasicRepository<Car, Long> {
? List<Car> findByType(CarType type);
? Optional<Car> findByName(String name);
}
@Inject
CarRepository repository;
...
Car ferrari = Car.id(10L).name("Ferrari").type(CarType.SPORT);
repository.save(ferrari);

Naturally, there are cases where you can define your terminology, going deep into Domain-Driven Design (DDD) and ubiquitous language. For example, you can create your Car collection and define its actions:

@Repository
public interface Garage {
? @Insert
? Car park(Car car);
}

Jakarta Data also introduces annotations that you can use to define database operations, such as the annotations @Insert, @Update, @Delete, @Find, and @Save. Furthermore, it brings three ways to generate queries on the repository:

  • Query by method, similar to Spring Data, where you can define a conventional nomenclature to do queries, such as to find a Product by its type.
List<Product> findByType(ProductType type);
  • The @Find annotation allows you to write a query that will match with the parameter. In this example, the annotation will return an instance of Stream<Car> based on its type.
@Find
Stream<Car> type(@By("type") CarType type);
  • With theJakarta Data Query Language (JDQL), a subset of Jakarta Persistence Query Language (JPQL), you can use a query that executes queries using text.
 @Query("where author.name = :author order by title")
? List<Book> findByAuthorSortedByTitle(String author);

Furthermore, pagination, which usually requires a significant amount of code, can be simplified using Jakarta Data because it defines the return type and includes the PageRequest interface. The code below shows two sample uses: one with the offset pagination and the second one with the cursor-based pagination.

@Repository
public interface CarRepository extends BasicRepository<Car, Long> {
Page<Car> findByTypeOrderByName(CarType type, PageRequest pageRequest);
@Find
@OrderBy(_Car.NAME)
@OrderBy(_Car.VIN)
CursoredPage<Car> type(CarType type, PageRequest pageRequest);
}

In this overview of Jakarta EE 11, you can see improved support for Java records, virtual threads, and the new persistence layer capabilities with Jakarta Data. But what does the future hold for Jakarta EE? Is there any plan for Jakarta EE 12? Yes, and we will cover that in the next section.

Jakarta EE 12 Targets Consistency and Configuration

Even with the recent release of Jakarta EE 11, work has already started for Jakarta EE 12 with a draft plan that includes the addition of new specifications to the Web Profile. The targeted release date is July 2026.

It is essential to note that this plan is still under development, and, as with any software development project, may be delayed or modified during the development process. Figure 2 below shows the status of the specifications for Jakarta EE 12.

Figure 2: The specifications and their respective versions proposed for Jakarta EE 12.

As Gavin King, Senior Distinguished Engineer at IBM and Creator of Hibernate, said on his social media, we have an exciting moment for persistence in the next version of Jakarta EE. If Jakarta EE 12 could have a nickname, we could define it as the Data Age, where it will include polyglot persistence within the Jakarta EE ecosystem. It will enable Jakarta to "speak" both SQL and NoSQL, thanks to the inclusion of Jakarta NoSQL 1.1 in the Platform.

@Inject
Template template;
...
Car ferrari = Car.id(1L)
? ? ? ? .name("Ferrari")
? ? ? ? .type(CarType.SPORT);
template.insert(ferrari);
Optional<Car> car = template.find(Car.class, 1L);
template.delete(Car.class, 1L);

Furthermore, several improvements have been made to Jakarta Data, including enhancements to the metamodel, which enable dynamic capabilities. Thus, we can dynamically change parameters. For example, imagine a scenario where we have a REST resource that allows you to define parameters, including those conditions.

In this case, we have a ProductSearchFilter class, where we can set up conditions used to return a Product based on those conditions. As you can see, the metadata generates fluent API conditions.

public class ProductSearchFilter {
? ? @QueryParam("type")
? ? private String type;
? ? @QueryParam("minPrice")
? ? private BigDecimal minPrice;
? ? @QueryParam("maxPrice")
? ? private BigDecimal maxPrice;
? ? @QueryParam("nameContains")
? ? private String nameContains;
? ? public Optional<String> type() {
? ? ? ? return Optional.ofNullable(type);
? ? }
? ? public Optional<BigDecimal> minPrice() {
? ? ? ? return Optional.ofNullable(minPrice);
? ? }
? ? public Optional<BigDecimal> maxPrice() {
? ? ? ? return Optional.ofNullable(maxPrice);
? ? }
? ? public Optional<String> nameContains() {
? ? ? ? return Optional.ofNullable(nameContains);
? ? }
}

? ? @GET
? ? public List<Product> find(@BeanParam ProductSearchFilter filter) {
? ? ? ? List<Restriction<Product>> conditions = new ArrayList<>();
? ? ? ? filter.type().ifPresent(value ->
? ? ? ? ? ? conditions.add(_Product.type.equalTo(ProductType.valueOf(value)))
? ? ? ? );
? ? ? ? filter.minPrice().ifPresent(value ->
? ? ? ? ? ? conditions.add(_Product.price.greaterThan(value))
? ? ? ? );
? ? ? ? filter.maxPrice().ifPresent(value ->
? ? ? ? ? ? conditions.add(_Product.price.lessThan(value))
? ? ? ? );
? ? ? ? filter.nameContains().ifPresent(value ->
? ? ? ? ? ? conditions.add(_Product.name.contains(value))
? ? ? ? );
? ? ? ? return products.findAll(Restriction.all(conditions));
? ? }

For polyglot persistence, we also have a new specification, Jakarta Query, with the goal of having a single query that defines an object-oriented query language designed for use with Jakarta Persistence, Jakarta Data, and Jakarta NoSQL.

It makes sense to consolidate all the persistence specifications. We have taken the first step with Jakarta Data, and now we will take this next step forward with the new Jakarta Query specification.

Building this specification will be challenging, primarily due to the diversity of structural storage found in persistence today, as well as a mismatch in impedance between the Java application, which employs object-oriented paradigms, and the database, which typically does not support them.

For example, when we have the classic association between two classes, a Car and its Driver:

public class Car {
private String plate;
private Driver driver;
}
public class Driver {
private String id;
private String name;
}

Imagine a scenario in which you will return the value from car.driver(). When we are working with databases, this could mean a JOIN, a subdocument, a user-defined type, or a graph relationship. Thus, this new specification required a common query while also being extensible to several kinds of databases that the specification supports.

In this article, we have seen several aspects of the release of Jakarta EE 11, as well as what we can expect from the future of the Platform. It includes a notable shift in the direction of data, extending beyond cloud-native applications. Jakarta EE is an open-source project under the Eclipse Foundation umbrella, and as usual, you can join and participate. It is mainly because, as Peter Drucker said, "The best way to predict the future is to create it". Therefore, let’s all participate and help shape the Java enterprise together.

About the Author

Rate this Article

Adoption
Style

BT
火棉胶婴儿是什么意思 16年是什么年 康桑密达是什么意思 热结旁流是什么意思 骨关节疼痛什么原因
记忆力减退吃什么药 变卖是什么意思 查体是什么意思 总警司相当于大陆什么官 糜烂性胃炎吃什么药好
越吃越瘦是什么原因 孩子发烧按摩什么部位退烧 光子嫩肤是什么 螺旋幽门杆菌吃什么药治疗好 后颈长痘痘是什么原因
蓝眼睛的猫是什么品种 什么是绩效工资 一九九七年属什么生肖 肥胖纹什么样子 做肌电图挂什么科
梦见偷菜是什么意思hcv8jop5ns8r.cn 脂肪肝什么东西不能吃hcv8jop6ns1r.cn 霸王花煲汤放什么材料hcv8jop5ns5r.cn 血沉是什么hcv9jop6ns5r.cn 髋关节弹响是什么原因hcv8jop4ns1r.cn
容五行属什么hcv8jop8ns9r.cn 趣味相投是什么意思hcv8jop5ns7r.cn 龙和什么生肖相冲0735v.com 孩子不愿意吃饭是什么原因hcv8jop2ns2r.cn 璀璨人生是什么意思hcv8jop4ns8r.cn
金可以组什么词hcv9jop2ns0r.cn 豆蔻年华是什么意思hcv9jop4ns3r.cn 无痛肠镜和普通肠镜有什么区别hcv8jop1ns0r.cn 望远镜10x50什么意思hcv9jop6ns2r.cn 琉璃和玻璃有什么区别hcv8jop4ns8r.cn
机关单位和事业单位有什么区别wuhaiwuya.com 涅盘是什么意思hcv9jop0ns1r.cn 尿路感染是什么引起的hcv7jop7ns4r.cn 正因数是什么hcv8jop5ns7r.cn 什么水果对心脏好hcv8jop5ns5r.cn
百度